#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include"./kernel/tcpkernel.h"
#include<QDebug>
#include<QMessageBox>
#include"login.h"
#include "RedisManager.h"
//??????
#include"search.h"
//?????
#include"md5.h"
#include<QFile>
#include<QFileDialog>
#include<QTime>
#include<QDateTime>
#include<list>
#include <QProgressBar>
#include <QElapsedTimer>
#include <QTimer>
#include <QDialog>
#include <QTextEdit>
#include <QLabel>
#include <QTableWidgetItem>
#include <QVBoxLayout>
#include <QInputDialog>
#include <QSettings>
#include <QString>
#include <QByteArray>
#include <QTextCodec>
#include <QMap> // 添加QMap支持
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

// 添加上传状态枚举
struct STRU_FILE{
    char m_szFilePath[260];
    char m_szFileName[260];
    char m_szFileuploadTime[260];
    char m_szFileMD5[260];
    long long m_FileSize;
    long m_pos;
    QProgressBar* m_pProgressBar;
    int m_rowIndex; // 保存文件在表格中的行索引  
    long long m_fileId; // 服务器文件ID
    int m_status; // 0=等待上传, 1=上传中, 2=暂停, 3=完成, 4=失败
};
// 添加下载文件信息结构体
struct DownloadFileInfo {
    QFile *file;
    long long fileId;
    long long fileSize;
    long long receivedSize;
    char szMD5[33];
};

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
public slots:
    void slots_login(STRU_LOGIN_RS*);//槽
    void slots_getfilelist(STRU_GETFILELIST_RS*);//槽
    void slots_uploadfile(STRU_UPLOADFILEINFO_RS*);//槽
    void slots_downloadfileinfo(STRU_DOWNLOADFILEINFO_RS *);
    void slots_downloadfileblock(STRU_DOWNLOADFILEBLOCK_RS *);
    void slots_deletefile(STRU_DELETEFILE_RS *);
    void slots_searchfile(STRU_SEARCHFILE_RS* psr);
    void slots_rename(STRU_RENAME_RS* prs);

private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
    void updateProgressAnimation(); // 进度条动画更新函数
    void on_pushButton_6_clicked();
    void on_pushButton_5_clicked();
    void on_pushButton_3_clicked();
    void on_pushButton_4_clicked();
    void on_pushButton_7_clicked();
    void on_pushButton_8_clicked();
    void on_pushButton_9_clicked();

private:
    void requestNextBlock(long long fileId);
    Ui::Widget *ui;
    IKernel*m_pKernel;
    login m_pLogin;
    long long m_userId;
    std::list<STRU_FILE*>m_lstFileInfo;
    int m_nFileNum;   
    QMap<long long, DownloadFileInfo*> m_mapDownloadFile;

    // 在Widget类中添加成员变量
private:
    QTimer m_progressAnimationTimer;
    double m_targetProgress = 0.0;
    double m_currentDisplayProgress = 0.0;
    bool m_bIsSearchMode;  // 当前是否在搜索模式
    QString m_currentSearchKey;  // 当前搜索关键字
    int m_currentSearchType;     // 当前搜索类型
    int m_currentPage = 0;      // 当前页码（从0开始）
    int m_totalPages = 0;       // 总页数
    int m_totalFiles = 0;       // 文件总数
private:
    // 上传任务持久化存储
    void saveUploadTasks();
    void loadUploadTasks();
    void removeUploadTask(const QString& filePath);
    // 上传任务管理
    QMap<QString, STRU_FILE*> m_uploadTasks; // 文件路径 -> 上传任务
    QTimer m_uploadSaveTimer; // 自动保存定时器

};
#endif // WIDGET_H
